package com.zjl.redis.第15章_缓存预热_雪崩_击穿_穿透;

/**
 * 缓存雪崩
 *  数据可压力变大服务器崩溃
 *
 * redis主机挂了，Redis全盘崩溃，偏硬件运维
 * redis中有大量key同时过期大面积失效，偏软件开发
 *
 * key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,
 * 这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,
 * 这个时候大并发的请求可能会瞬间把后端DB压垮。
 * 缓存雪崩与缓存击穿的区别在于这里针对很多key缓存,前者则是某一个key.
 * 原因：
 *  1.在极少时间段,查询大量key的集中过期情况
 *
 * 缓存失效时的雪崩效应对底层系统的冲击非常可怕!
 * 解决方案
 * (1) 构建多级缓存架构:
 *      nginx缓存 + redis缓存 + 其他缓存(ehcache本地缓存 等)
 * (2) 使用锁或队列:
 *      用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,
 *      从而避免失效时大量的并发请求落到底层存储系统上。不适用高并发情况，
 * (3) 设置过期标志更新缓存:。
 *      记录缓存数据是否过期(设置提前量) ,
 *      如果过期会触发通知另外的线程在后台去更新实际key的缓存。
 * (4)将缓存失效时间分散开 :
 *      比如我们可以在原有的失效时间基础。
 *      上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,
 *      就很难引发集体失效的事件。
 * (5) 服务降级 :
 *      Hystrix或者阿里 sentinel 限流降级
 *
 *
 *
 */
public class D_缓存雪崩 {
}